import Vue from 'vue'
// 请求配置
const http = uni.$u.http

// 请求拦截器
const requestInterceptor = (config) => {
	// 在发送请求之前做些什么
	config.header = config.header || {}

	// 可以在这里添加全局请求头
	if (config.header['Content-Type']) {
		config.header['Content-Type'] = 'application/json;charset=UTF-8'
	}


	// 获取token
	const token = uni.getStorageSync('token')

	// 如果存在token，则同时添加到请求头和查询参数中
	if (token) {
		// 添加到Authorization头
		config.header['Authorization'] = token

		// 如果请求参数是对象，并且没有显式传入token，则添加到查询参数中
		if (config.params && typeof config.params === 'object' && !('token' in config.params)) {
			// config.params.token = "7719cbad7ccff2a340a890447608f99d"
			config.params.token = token
			config.params.tuiguangid = uni.getStorageSync('tuiguangid') || '';
			config.params.supplierid = uni.getStorageSync('supplierid') || '';
			config.params.app_id = Vue.prototype.getAppId();
			config.params.tguser_id = uni.getStorageSync('tguser_id') || '';
		}
	}

	// 显示loading
	if (config.custom?.loading !== false) {
		uni.showLoading({
			title: '加载中...',
			mask: true
		})
	}
	return config
}

// 响应拦截器
const responseInterceptor = (response) => {
	// 对响应数据做点什么
	if (response.config.custom?.loading !== false) {
		uni.hideLoading()
	}

	const res = response.data

	// 这里可以根据后端的响应格式进行调整
	const successCodes = [200, 1]
	if (!successCodes.includes(res.code)) {
		// token过期
		if (res.code === 401) {
			// 跳转到登录页
			uni.reLaunch({
				url: '/pages/login/login'
			})
			return Promise.reject(new Error('登录已过期，请重新登录'))
		}

		// 托管经营申请相关错误
		if (res.code === 0 && res.msg && res.msg.includes('请申请成为托管经营')) {
			uni.hideLoading()
			// uni.showModal({
			// 	title: '提示',
			// 	content: '您需要先申请成为托管经营者才能使用此功能，是否立即申请？',
			// 	confirmText: '去申请',
			// 	cancelText: '取消',
			// 	success: (modalRes) => {
			// 		if (modalRes.confirm) {
			// 			// 跳转到托管申请页面
			// 			uni.navigateTo({
			// 				url: '/pages/trusteeship/apply'
			// 			})
			// 		}
			// 	}
			// })
			return Promise.reject(new Error(res.msg))
		}

		// 其他错误处理
		uni.showToast({
			title: res.msg || '请求失败',
			icon: 'none',
			duration: 3000
		})
		return Promise.reject(res.msg || 'Error')
	}

	return res
}

// 错误处理
const errorHandler = (error) => {
	uni.hideLoading()

	// 对响应错误做点什么
	let message = '请求失败'
	if (error.errMsg) {
		if (error.errMsg.includes('timeout')) {
			message = '请求超时'
		} else if (error.errMsg.includes('abort')) {
			message = '请求被取消'
		} else if (error.errMsg.includes('fail')) {
			message = '网络连接失败，请检查网络'
		}
	}

	uni.showToast({
		title: message,
		icon: 'none'
	})

	return Promise.reject(error)
}

// 注册拦截器
uni.$u.http.interceptors.request.use(requestInterceptor, errorHandler)
uni.$u.http.interceptors.response.use(responseInterceptor, errorHandler)

// 导出请求方法
export default {
	get(url, data, config = {}) {
		return uni.$u.http.get(url, {
			params: data,
			...config
		})
	},

	post(url, data, config = {}) {
		return uni.$u.http.post(url, data, config)
	},

	put(url, data, config = {}) {
		return uni.$u.http.put(url, data, config)
	},

	delete(url, data, config = {}) {
		return uni.$u.http.delete(url, {
			data,
			...config
		})
	},

	upload(url, filePath, name = 'file', formData = {}, config = {}) {
		return uni.$u.http.upload(url, {
			filePath,
			name,
			formData,
			...config
		})
	},

	download(url, config = {}) {
		return uni.$u.http.download(url, config)
	}
}